home *** CD-ROM | disk | FTP | other *** search
-
- FTS(3) UNIX Programmer's Manual FTS(3)
-
- NNAAMMEE
- ffttss - traverse a file hierarchy
-
- SSYYNNOOPPSSIISS
- ##iinncclluuddee <<ssyyss//ttyyppeess..hh>>
- ##iinncclluuddee <<ssyyss//ssttaatt..hh>>
- ##iinncclluuddee <<ffttss..hh>>
-
- _F_T_S _*
- ffttss__ooppeenn(_c_h_a_r _* _c_o_n_s_t _*_p_a_t_h___a_r_g_v, _i_n_t _o_p_t_i_o_n_s,
- _i_n_t _*_c_o_m_p_a_r_(_c_o_n_s_t _F_T_S_E_N_T _*_*_, _c_o_n_s_t _F_T_S_E_N_T _*_*_))
-
- _F_T_S_E_N_T _*
- ffttss__rreeaadd(_F_T_S _*_f_t_s_p)
-
- _F_T_S_E_N_T _*
- ffttss__cchhiillddrreenn(_F_T_S _*_f_t_s_p, _i_n_t _o_p_t_i_o_n_s)
-
- _i_n_t
- ffttss__sseett(_F_T_S _f_t_s_p, _F_T_S_E_N_T _*_f, _i_n_t _o_p_t_i_o_n_s)
-
- _i_n_t
- ffttss__cclloossee(_F_T_S _*_f_t_s_p)
-
- DDEESSCCRRIIPPTTIIOONN
- The ffttss functions are provided for traversing UNIX file hierarchies. A
- simple overview is that the ffttss__ooppeenn() function returns a ``handle'' on a
- file hierarchy, which is then supplied to the other ffttss functions. The
- function ffttss__rreeaadd() returns a pointer to a structure describing one of
- the files in the file hierarchy. The function ffttss__cchhiillddrreenn() returns a
- pointer to a linked list of structures, each of which describes one of
- the files contained in a directory in the hierarchy. In general, direc-
- tories are visited two distinguishable times; in pre-order (before any of
- their descendants are visited) and in post-order (after all of their de-
- scendants have been visited). Files are visited once. It is possible to
- walk the hierarchy ``logically'' (ignoring symbolic links) or physically
- (visiting symbolic links), order the walk of the hierarchy or prune
- and/or re-visit portions of the hierarchy.
-
- Two structures are defined (and typedef'd) in the include file <_f_t_s_._h>.
- The first is _F_T_S, the structure that represents the file hierarchy it-
- self. The second is _F_T_S_E_N_T, the structure that represents a file in the
- file hierarchy. Normally, an _F_T_S_E_N_T structure is returned for every file
- in the file hierarchy. In this manual page, ``file'' and ``_F_T_S_E_N_T
- structure'' are generally interchangeable. The _F_T_S_E_N_T structure contains
- at least the following fields, which are described in greater detail be-
- low:
-
- typedef struct _ftsent {
- u_short fts_info; /* flags for FTSENT structure */
- char *fts_accpath; /* access path */
- char *fts_path; /* root path */
- short fts_pathlen; /* strlen(fts_path) */
- char *fts_name; /* file name */
- short fts_namelen; /* strlen(fts_name) */
- short fts_level; /* depth (-1 to N) */
- int fts_errno; /* file errno */
- long fts_number; /* local numeric value */
- void *fts_pointer; /* local address value */
- struct ftsent *fts_parent; /* parent directory */
- struct ftsent *fts_link; /* next file structure */
- struct ftsent *fts_cycle; /* cycle structure */
- struct stat *fts_statp; /* stat(2) information */
- } FTSENT;
-
- These fields are defined as follows:
-
- _f_t_s___i_n_f_o One of the following flags describing the returned _F_T_S_E_N_T
- structure and the file it represents. With the exception of
- directories without errors (FTS_D), all of these entries are
- terminal, that is, they will not be revisited, nor will any
- of their descendants be visited.
-
- FTS_D A directory being visited in pre-order.
-
- FTS_DC A directory that causes a cycle in the tree.
- (The _f_t_s___c_y_c_l_e field of the _F_T_S_E_N_T structure
- will be filled in as well.)
-
- FTS_DEFAULT Any _F_T_S_E_N_T structure that represents a file
- type not explicitly described by one of the
- other _f_t_s___i_n_f_o values.
-
- FTS_DNR A directory which cannot be read. This is an
- error return, and the _f_t_s___e_r_r_n_o field will be
- set to indicate what caused the error.
-
- FTS_DOT A file named `.' or `..' which was not speci-
- fied as a file name to ffttss__ooppeenn() (see
- FTS_SEEDOT).
-
- FTS_DP A directory being visited in post-order. The
- contents of the _F_T_S_E_N_T structure will be un-
- changed from when it was returned in pre-order,
- i.e. with the _f_t_s___i_n_f_o field set to FTS_D.
-
- FTS_ERR This is an error return, and the _f_t_s___e_r_r_n_o
- field will be set to indicate what caused the
- error.
-
- FTS_F A regular file.
-
- FTS_NS A file for which no stat(2) information was
- available. The contents of the _f_t_s___s_t_a_t_p field
- are undefined. This is an error return, and
- the _f_t_s___e_r_r_n_o field will be set to indicate
- what caused the error.
-
- FTS_NSOK A file for which no stat(2) information was re-
- quested. The contents of the _f_t_s___s_t_a_t_p field
- are undefined.
-
- FTS_SL A symbolic link.
-
- FTS_SLNONE A symbolic link with a non-existent target.
- The contents of the _f_t_s___s_t_a_t_p field reference
- the file characteristic information for the
- symbolic link itself.
-
- _f_t_s___a_c_c_p_a_t_h A path for accessing the file from the current directory.
-
- _f_t_s___p_a_t_h The path for the file relative to the root of the traversal.
- This path contains the path specified to ffttss__ooppeenn() as a
- prefix.
-
- _f_t_s___p_a_t_h_l_e_n The length of the string referenced by _f_t_s___p_a_t_h.
-
-
- _f_t_s___n_a_m_e The name of the file.
-
- _f_t_s___n_a_m_e_l_e_n The length of the string referenced by _f_t_s___n_a_m_e.
-
- _f_t_s___l_e_v_e_l The depth of the traversal, numbered from -1 to N, where
- this file was found. The _F_T_S_E_N_T structure representing the
- parent of the starting point (or root) of the traversal is
- numbered -1, and the _F_T_S_E_N_T structure for the root itself is
- numbered 0.
-
- _f_t_s___e_r_r_n_o Upon return of a _F_T_S_E_N_T structure from the ffttss__cchhiillddrreenn() or
- ffttss__rreeaadd() functions, with its _f_t_s___i_n_f_o field set to
- FTS_DNR, FTS_ERR or FTS_NS, the _f_t_s___e_r_r_n_o field contains the
- value of the external variable _e_r_r_n_o specifying the cause of
- the error. Otherwise, the contents of the _f_t_s___e_r_r_n_o field
- are undefined.
-
- _f_t_s___n_u_m_b_e_r This field is provided for the use of the application pro-
- gram and is not modified by the ffttss functions. It is ini-
- tialized to 0.
-
- _f_t_s___p_o_i_n_t_e_r This field is provided for the use of the application pro-
- gram and is not modified by the ffttss functions. It is ini-
- tialized to NULL.
-
- _f_t_s___p_a_r_e_n_t A pointer to the _F_T_S_E_N_T structure referencing the file in
- the hierarchy immediately above the current file, i.e. the
- directory of which this file is a member. A parent struc-
- ture for the initial entry point is provided as well, howev-
- er, only the _f_t_s___l_e_v_e_l, _f_t_s___n_u_m_b_e_r and _f_t_s___p_o_i_n_t_e_r fields
- are guaranteed to be initialized.
-
- _f_t_s___l_i_n_k Upon return from the ffttss__cchhiillddrreenn() function, the _f_t_s___l_i_n_k
- field points to the next structure in the NULL-terminated
- linked list of directory members. Otherwise, the contents
- of the _f_t_s___l_i_n_k field are undefined.
-
- _f_t_s___c_y_c_l_e If a directory causes a cycle in the hierarchy (see FTS_DC),
- either because of a hard link between two directories, or a
- symbolic link pointing to a directory, the _f_t_s___c_y_c_l_e field
- of the structure will point to the _F_T_S_E_N_T structure in the
- hierarchy that references the same file as the current
- _F_T_S_E_N_T structure. Otherwise, the contents of the _f_t_s___c_y_c_l_e
- field are undefined.
-
- _f_t_s___s_t_a_t_p A pointer to stat(2) information for the file.
-
- A single buffer is used for all of the paths of all of the files in the
- file hierarchy. Therefore, the _f_t_s___p_a_t_h and _f_t_s___a_c_c_p_a_t_h fields are guar-
- anteed to be NULL-terminated _o_n_l_y for the file most recently returned by
- ffttss__rreeaadd(). To use these fields to reference any files represented by
- other _F_T_S_E_N_T structures will require that the path buffer be modified us-
- ing the information contained in that _F_T_S_E_N_T structure's _f_t_s___p_a_t_h_l_e_n
- field. Any such modifications should be undone before further calls to
- ffttss__rreeaadd() are attempted. The _f_t_s___n_a_m_e field is always NULL-terminated.
-
- FFTTSS__OOPPEENN
- The ffttss__ooppeenn() function takes a pointer to an array of character pointers
- naming one or more paths which make up a logical file hierarchy to be
- traversed. The array must be terminated by a NULL pointer.
-
- There are a number of options, at least one of which (either FTS_LOGICAL
- or FTS_PHYSICAL) must be specified. The options are selected by _o_r'ing
- the following values:
-
- FTS_COMFOLLOW
- This option causes any symbolic link specified as a root
- path to be followed immediately whether or not FTS_LOGICAL
- is also specified.
-
- FTS_LOGICAL This option causes the ffttss routines to return _F_T_S_E_N_T struc-
- tures for the targets of symbolic links instead of the sym-
- bolic links themselves. If this option is set, the only
- symbolic links for which _F_T_S_E_N_T structures are returned to
- the application are those referencing non-existent files.
- Either FTS_LOGICAL or FTS_PHYSICAL _m_u_s_t be provided to the
- ffttss__ooppeenn() function.
-
- FTS_NOCHDIR As a performance optimization, the ffttss functions change di-
- rectories as they walk the file hierarchy. This has the
- side-effect that an application cannot rely on being in any
- particular directory during the traversal. The FTS_NOCHDIR
- option turns off this optimization, and the ffttss functions
- will not change the current directory. Note that applica-
- tions should not themselves change their current directory
- and try to access files unless FTS_NOCHDIR is specified and
- absolute pathnames were provided as arguments to
- ffttss__ooppeenn().
-
- FTS_NOSTAT By default, returned _F_T_S_E_N_T structures reference file char-
- acteristic information (the _s_t_a_t_p field) for each file vis-
- ited. This option relaxes that requirement as a perfor-
- mance optimization, allowing the ffttss functions to set the
- _f_t_s___i_n_f_o field to FTS_NSOK and leave the contents of the
- _s_t_a_t_p field undefined.
-
- FTS_PHYSICAL This option causes the ffttss routines to return _F_T_S_E_N_T struc-
- tures for symbolic links themselves instead of the target
- files they point to. If this option is set, _F_T_S_E_N_T struc-
- tures for all symbolic links in the hierarchy are returned
- to the application. Either FTS_LOGICAL or FTS_PHYSICAL
- _m_u_s_t be provided to the ffttss__ooppeenn() function.
-
- FTS_SEEDOT By default, unless they are specified as path arguments to
- ffttss__ooppeenn(), any files named `.' or `..' encountered in the
- file hierarchy are ignored. This option causes the ffttss
- routines to return _F_T_S_E_N_T structures for them.
-
- FTS_XDEV This option prevents ffttss from descending into directories
- that have a different device number than the file from
- which the descent began.
-
- The argument ccoommppaarr() specifies a user-defined function which may be used
- to order the traversal of the hierarchy. It takes two pointers to point-
- ers to _F_T_S_E_N_T structures as arguments and should return a negative value,
- zero, or a positive value to indicate if the file referenced by its first
- argument comes before, in any order with respect to, or after, the file
- referenced by its second argument. The _f_t_s___a_c_c_p_a_t_h, _f_t_s___p_a_t_h and
- _f_t_s___p_a_t_h_l_e_n fields of the _F_T_S_E_N_T structures may _n_e_v_e_r be used in this
- comparison. If the _f_t_s___i_n_f_o field is set to FTS_NS or FTS_NSOK, the
- _f_t_s___s_t_a_t_p field may not either. If the ccoommppaarr() argument is NULL, the
- directory traversal order is in the order listed in _p_a_t_h___a_r_g_v for the
- root paths, and in the order listed in the directory for everything else.
-
- FFTTSS__RREEAADD
- The ffttss__rreeaadd() function returns a pointer to an _F_T_S_E_N_T structure describ-
- ing a file in the hierarchy. Directories (that are readable and do not
- cause cycles) are visited at least twice, once in pre-order and once in
- post-order. All other files are visited at least once. (Hard links be-
- tween directories that do not cause cycles or symbolic links to symbolic
- links may cause files to be visited more than once, or directories more
- than twice.)
-
- If all the members of the hierarchy have been returned, ffttss__rreeaadd() re-
- turns NULL and sets the external variable _e_r_r_n_o to 0. If an error unre-
- lated to a file in the hierarchy occurs, ffttss__rreeaadd() returns NULL and sets
- _e_r_r_n_o appropriately. If an error related to a returned file occurs, a
- pointer to an _F_T_S_E_N_T structure is returned, and _e_r_r_n_o may or may not have
- been set (see _f_t_s___i_n_f_o).
-
- The _F_T_S_E_N_T structures returned by ffttss__rreeaadd() may be overwritten after a
- call to ffttss__cclloossee() on the same file hierarchy stream, or, after a call
- to ffttss__rreeaadd() on the same file hierarchy stream unless they represent a
- file of type directory, in which case they will not be overwritten until
- after a call to ffttss__rreeaadd() after the _F_T_S_E_N_T structure has been returned
- by the function ffttss__rreeaadd() in post-order.
-
- FFTTSS__CCHHIILLDDRREENN
- The ffttss__cchhiillddrreenn() function returns a pointer to an _F_T_S_E_N_T structure de-
- scribing the first entry in a NULL-terminated linked list of the files in
- the directory represented by the _F_T_S_E_N_T structure most recently returned
- by ffttss__rreeaadd(). The list is linked through the _f_t_s___l_i_n_k field of the
- _F_T_S_E_N_T structure, and is ordered by the user-specified comparison func-
- tion, if any. Repeated calls to ffttss__cchhiillddrreenn() will recreate this linked
- list.
-
- As a special case, if ffttss__rreeaadd() has not yet been called for a hierarchy,
- ffttss__cchhiillddrreenn() will return a pointer to the files in the logical directo-
- ry specified to ffttss__ooppeenn(), i.e. the arguments specified to ffttss__ooppeenn().
- Otherwise, if the _F_T_S_E_N_T structure most recently returned by ffttss__rreeaadd()
- is not a directory being visited in pre-order, or the directory does not
- contain any files, ffttss__cchhiillddrreenn() returns NULL and sets _e_r_r_n_o to zero.
- If an error occurs, ffttss__cchhiillddrreenn() returns NULL and sets _e_r_r_n_o appropri-
- ately.
-
- The _F_T_S_E_N_T structures returned by ffttss__cchhiillddrreenn() may be overwritten after
- a call to ffttss__cchhiillddrreenn(), ffttss__cclloossee() or ffttss__rreeaadd() on the same file hi-
- erarchy stream.
-
- _O_p_t_i_o_n may be set to the following value:
-
- FTS_NAMEONLY Only the names of the files are needed. The contents of
- all the fields in the returned linked list of structures
- are undefined with the exception of the _f_t_s___n_a_m_e and
- _f_t_s___n_a_m_e_l_e_n fields.
-
- FFTTSS__SSEETT
- The function ffttss__sseett() allows the user application to determine further
- processing for the file _f of the stream _f_t_s_p. The ffttss__sseett() function re-
- turns 0 on success, and -1 if an error occurs. _O_p_t_i_o_n must be set to one
- of the following values:
-
- FTS_AGAIN Re-visit the file; any file type may be re-visited. The
- next call to ffttss__rreeaadd() will return the referenced file.
- The _f_t_s___s_t_a_t and _f_t_s___i_n_f_o fields of the structure will be
- reinitialized at that time, but no other fields will have
- been changed. This option is meaningful only for the most
- recently returned file from ffttss__rreeaadd(). Normal use is for
- post-order directory visits, where it causes the directory
- to be re-visited (in both pre and post-order) as well as
- all of its descendants.
-
- FTS_FOLLOW The referenced file must be a symbolic link. If the refer-
- enced file is the one most recently returned by ffttss__rreeaadd(),
- the next call to ffttss__rreeaadd() returns the file with the
- _f_t_s___i_n_f_o and _f_t_s___s_t_a_t_p fields reinitialized to reflect the
- target of the symbolic link instead of the symbolic link
- itself. If the file is one of those most recently returned
- by ffttss__cchhiillddrreenn(), the _f_t_s___i_n_f_o and _f_t_s___s_t_a_t_p fields of the
- structure, when returned by ffttss__rreeaadd(), will reflect the
- target of the symbolic link instead of the symbolic link
- itself. In either case, if the target of the symbolic link
- does not exist the fields of the returned structure will be
- unchanged and the _f_t_s___i_n_f_o field will be set to FTS_SLNONE.
-
- If the target of the link is a directory, the pre-order re-
- turn, followed by the return of all of its descendants,
- followed by a post-order return, is done.
-
- FTS_SKIP No descendants of this file are visited. The file may be
- one of those most recently returned by either
- ffttss__cchhiillddrreenn() or ffttss__rreeaadd().
-
- FFTTSS__CCLLOOSSEE
- The ffttss__cclloossee() function closes a file hierarchy stream _f_t_s_p and restores
- the current directory to the directory from which ffttss__ooppeenn() was called
- to open _f_t_s_p. The ffttss__cclloossee() function returns 0 on success, and -1 if an
- error occurs.
-
- EERRRROORRSS
- The function ffttss__ooppeenn() may fail and set _e_r_r_n_o for any of the errors
- specified for the library functions open(2) and malloc(3).
-
- The function ffttss__cclloossee() may fail and set _e_r_r_n_o for any of the errors
- specified for the library functions chdir(2) and close(2).
-
- The functions ffttss__rreeaadd() and ffttss__cchhiillddrreenn() may fail and set _e_r_r_n_o for
- any of the errors specified for the library functions chdir(2),
- malloc(3), opendir(3), readdir(3) and stat(2).
-
- In addition, ffttss__cchhiillddrreenn(), ffttss__ooppeenn() and ffttss__sseett() may fail and set
- _e_r_r_n_o as follows:
-
- [EINVAL] The options were invalid.
-
- SSEEEE AALLSSOO
- find(1), chdir(2), stat(2), qsort(3)
-
- SSTTAANNDDAARRDDSS
- The ffttss utility is expected to be included in a future IEEE
- Std1003.1-1988 (``POSIX'') revision.
-
- BSD Experimental April 16, 1994 6
-